package com.newtouch.bxzs.syslog.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.newtouch.bxzs.common.base.BaseErrorEnum;
import com.newtouch.bxzs.common.base.BaseException;
import com.newtouch.bxzs.common.base.model.LogError;
import com.newtouch.bxzs.common.base.util.EntityToBeanUtils;
import com.newtouch.bxzs.syslog.mapper.LogErrorMapper;
import com.newtouch.bxzs.syslog.model.bo.LogErrorBO;
import com.newtouch.bxzs.syslog.model.vo.LogErrorVO;
import com.newtouch.bxzs.syslog.service.LogErrorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.List;

/**
 * 异常日志service 实现类
 *
 * <p>
 * <b>History:</b>
 * <table border="1">
 * <tr>
 * <th>Date</th>
 * <th>Operator</th>
 * <th>Memo</th>
 * </tr>
 * <tr>
 * <td>2020年12月18日</td>
 * <td>renyi</td>
 * <td>Update</td>
 * </tr>
 * </table>
 *
 * @author renyi
 * @version 1.0.0
 * @since 1.0.0
 */
@Service
public class LogErrorServiceImpl extends ServiceImpl<LogErrorMapper, LogError> implements LogErrorService {

	/**
	 * 日期格式化
	 */
	private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

	@Autowired
	private LogErrorMapper logErrorMapper;

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.newtouch.bxzs.syslog.service.LogErrorService#selectLogErrorList(com.
	 * newtouch.bxzs.syslog.model.vo.LogErrorVO)
	 */
	@Override
	public IPage<LogErrorBO> selectLogErrorList(LogErrorVO logErrorVO) {
		QueryWrapper<LogError> wrapper = new QueryWrapper<>();
		String errorTimeCloumn = "ERROR_OCCURRENCE_TIME";
		// 判断用户是否输入开始时间和结束时间
		if (logErrorVO.getStartTime() == null && logErrorVO.getEndTime() == null) {
			// 默认查询近七天记录
			Date datetime = DateUtil.beginOfDay(DateUtil.lastWeek());
			// 设置查询条件
			wrapper.ge(errorTimeCloumn, datetime);
		}
		// 当开始时间不为空
		if (logErrorVO.getStartTime() != null) {
			wrapper.ge(errorTimeCloumn, DateUtil.format(logErrorVO.getStartTime(), DATE_FORMAT));
		}
		// 当结束时间不为空
		if (logErrorVO.getEndTime() != null) {
			wrapper.le(errorTimeCloumn, DateUtil.format(logErrorVO.getEndTime(), DATE_FORMAT));
		}
		// 按异常时间降序排列
		wrapper.orderByDesc(errorTimeCloumn);
		// 分页查询
		Page<LogError> logErrorPage = logErrorMapper
				.selectPage(new Page<>(logErrorVO.getCurrentPage(), logErrorVO.getPageSize()), wrapper);
		if (BeanUtil.isEmpty(logErrorPage) || CollectionUtil.isEmpty(logErrorPage.getRecords())) {
			return null;
		}
		// 查询结果列表
		// 将LogError 转为LogErrorBO
		List<LogErrorBO> logErrorBOList = EntityToBeanUtils.copyBean(logErrorPage.getRecords(), LogErrorBO.class);
		// 设置查询 LogError 分页返回结果
		Page<LogErrorBO> logErrorBOPage = new Page<>(logErrorPage.getCurrent(), logErrorPage.getSize(),
				logErrorPage.getTotal());
		logErrorBOPage.setPages(logErrorPage.getPages());
		logErrorBOPage.setRecords(logErrorBOList);
		return logErrorBOPage;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.newtouch.bxzs.syslog.service.LogErrorService#getLogErrorById(java.
	 * lang.String)
	 */
	@Override
	public LogErrorBO getLogErrorDetail(String errorLogId) {
		if (StringUtils.isEmpty(errorLogId)) {
			throw new BaseException(BaseErrorEnum.REQUEST_DATA_NULL);
		}
		// 通过id查询日志
		LogError logError = logErrorMapper.selectById(errorLogId);
		if (BeanUtil.isEmpty(logError)) {
			return null;
		}
		LogErrorBO logErrorBO = new LogErrorBO();
		BeanUtil.copyProperties(logError, logErrorBO);
		return logErrorBO;
	}
}
